{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Otto商品预测——LightGBM\n",
    "\n",
    "  \n",
    "## 1、数据处理\n",
    "\n",
    "### （1）导入相关包和数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "dpath = './Otto/data/'\n",
    "\n",
    "# 采用tf_idf特征\n",
    "train = pd.read_csv(dpath +\"Otto_FE_train_tfidf.csv\")\n",
    "\n",
    "# 将类别字符串变成数字，LightGBM不支持字符串格式的特征输入/标签输入\n",
    "y = train['target']\n",
    "y = y.map(lambda s: s[6:])\n",
    "y = y.map(lambda s: int(s) - 1)\n",
    "\n",
    "X = train.drop([\"id\", \"target\"], axis=1)\n",
    "\n",
    "feat_names = X.columns "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （2）分割数据\n",
    "\n",
    "    数据集太大了，电脑它带不动，我让它争气点也不行呐。所以，采用train_test_split，从数据集中随机抽取20000条记录，用来训练模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py:2179: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feat_1_tfidf</th>\n",
       "      <th>feat_2_tfidf</th>\n",
       "      <th>feat_3_tfidf</th>\n",
       "      <th>feat_4_tfidf</th>\n",
       "      <th>feat_5_tfidf</th>\n",
       "      <th>feat_6_tfidf</th>\n",
       "      <th>feat_7_tfidf</th>\n",
       "      <th>feat_8_tfidf</th>\n",
       "      <th>feat_9_tfidf</th>\n",
       "      <th>feat_10_tfidf</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_84_tfidf</th>\n",
       "      <th>feat_85_tfidf</th>\n",
       "      <th>feat_86_tfidf</th>\n",
       "      <th>feat_87_tfidf</th>\n",
       "      <th>feat_88_tfidf</th>\n",
       "      <th>feat_89_tfidf</th>\n",
       "      <th>feat_90_tfidf</th>\n",
       "      <th>feat_91_tfidf</th>\n",
       "      <th>feat_92_tfidf</th>\n",
       "      <th>feat_93_tfidf</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>18853</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.228651</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>39175</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.063957</td>\n",
       "      <td>0.059682</td>\n",
       "      <td>0.090344</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.069182</td>\n",
       "      <td>...</td>\n",
       "      <td>0.107183</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.064188</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.062573</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44367</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.717483</td>\n",
       "      <td>0.236301</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.033896</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>52289</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.068361</td>\n",
       "      <td>0.157424</td>\n",
       "      <td>0.184143</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.152159</td>\n",
       "      <td>0.112248</td>\n",
       "      <td>0.076437</td>\n",
       "      <td>0.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.445618</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61207</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.088471</td>\n",
       "      <td>0.481966</td>\n",
       "      <td>0.04858</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 93 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       feat_1_tfidf  feat_2_tfidf  feat_3_tfidf  feat_4_tfidf  feat_5_tfidf  \\\n",
       "18853           0.0           0.0      0.000000      0.000000      0.000000   \n",
       "39175           0.0           0.0      0.063957      0.059682      0.090344   \n",
       "44367           0.0           0.0      0.717483      0.236301      0.000000   \n",
       "52289           0.0           0.0      0.000000      0.000000      0.000000   \n",
       "61207           0.0           0.0      0.000000      0.000000      0.000000   \n",
       "\n",
       "       feat_6_tfidf  feat_7_tfidf  feat_8_tfidf  feat_9_tfidf  feat_10_tfidf  \\\n",
       "18853           0.0           0.0      0.000000      0.000000       0.000000   \n",
       "39175           0.0           0.0      0.000000      0.000000       0.069182   \n",
       "44367           0.0           0.0      0.033896      0.000000       0.000000   \n",
       "52289           0.0           0.0      0.068361      0.157424       0.184143   \n",
       "61207           0.0           0.0      0.000000      0.000000       0.000000   \n",
       "\n",
       "       ...  feat_84_tfidf  feat_85_tfidf  feat_86_tfidf  feat_87_tfidf  \\\n",
       "18853  ...       0.000000       0.000000       0.228651       0.000000   \n",
       "39175  ...       0.107183       0.000000       0.000000       0.000000   \n",
       "44367  ...       0.000000       0.000000       0.000000       0.000000   \n",
       "52289  ...       0.000000       0.152159       0.112248       0.076437   \n",
       "61207  ...       0.000000       0.000000       0.088471       0.481966   \n",
       "\n",
       "       feat_88_tfidf  feat_89_tfidf  feat_90_tfidf  feat_91_tfidf  \\\n",
       "18853        0.00000       0.000000       0.000000            0.0   \n",
       "39175        0.00000       0.064188       0.000000            0.0   \n",
       "44367        0.00000       0.000000       0.000000            0.0   \n",
       "52289        0.00000       0.000000       0.445618            0.0   \n",
       "61207        0.04858       0.000000       0.000000            0.0   \n",
       "\n",
       "       feat_92_tfidf  feat_93_tfidf  \n",
       "18853       0.000000            0.0  \n",
       "39175       0.062573            0.0  \n",
       "44367       0.000000            0.0  \n",
       "52289       0.000000            0.0  \n",
       "61207       0.000000            0.0  \n",
       "\n",
       "[5 rows x 93 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从数据集中随机分割出20,000的样本作为训练集\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_drop, y_train, y_drop = train_test_split(X, y, train_size=20000, random_state=10)\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(20000, 93)\n"
     ]
    }
   ],
   "source": [
    "print (X_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "X_train = csr_matrix(X_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2、构建模型\n",
    "    \n",
    "    LightGBM的主要超参数包括：\n",
    "    \n",
    "        1. n_estimators（树的数目）和 learning_rate（学习率）\n",
    "        2. max_depth（树的最大深度）和 num_leaves（树的最大叶子节点数目）\n",
    "        3. min_data_in_leaf / min_data / min_child_samples（叶子结点的最小样本数）和 min_child_weight（叶子节点Hessian权重和）\n",
    "        4. colsample_bytree / feature_fraction（每棵树的列采样比例）\n",
    "        5. subsample / bagging_fraction + bagging_freq=1（每棵树的行采样比例）\n",
    "        6. lambda_l1 / reg_alpha（L1正则化参数）和 lambda_l2 / reg_lambda（L2正则化参数）\n",
    "        \n",
    "        7. max_bin（特征的最大bin数目）\n",
    "        8. subsample_for_bin（建立直方图的样本数目）\n",
    "\n",
    "\n",
    "\n",
    "### 2.1、LightGBM（GBDT）\n",
    "\n",
    "### （1）调参n_estimators\n",
    "\n",
    "    先预设eta=0.1，粗调基学习器的数目n_estimators。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/.local/lib/python3.7/site-packages/lightgbm/__init__.py:48: UserWarning: Starting from version 2.2.1, the library file in distribution wheels for macOS is built by the Apple Clang (Xcode_8.3.3) compiler.\n",
      "This means that in case of installing LightGBM from PyPI via the ``pip install lightgbm`` command, you don't need to install the gcc compiler anymore.\n",
      "Instead of that, you need to install the OpenMP library, which is required for running LightGBM on the system with the Apple Clang compiler.\n",
      "You can install the OpenMP library by the following command: ``brew install libomp``.\n",
      "  \"You can install the OpenMP library by the following command: ``brew install libomp``.\", UserWarning)\n"
     ]
    }
   ],
   "source": [
    "import lightgbm as lgbm\n",
    "\n",
    "MAX_ROUNDS = 10000\n",
    "\n",
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'max_bin': 127, # 2^6,原始特征为整数，很少超过100\n",
    "          'subsample': 0.7,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "# 直接调用lightgbm内嵌的交叉验证(cv)，可对连续的n_estimators参数进行快速交叉验证\n",
    "def get_n_estimators(params , X_train , y_train , early_stopping_rounds=10):\n",
    "    lgbm_params = params.copy()\n",
    "    lgbm_params['num_class'] = 9\n",
    "     \n",
    "    lgbmtrain = lgbm.Dataset(X_train , y_train )\n",
    "    cv_result = lgbm.cv(lgbm_params , lgbmtrain , num_boost_round=MAX_ROUNDS , nfold=10,  metrics='multi_logloss' , early_stopping_rounds=early_stopping_rounds, seed=3 )\n",
    "     \n",
    "    print('best n_estimators:' , len(cv_result['multi_logloss-mean']))\n",
    "    print('best cv score:' , cv_result['multi_logloss-mean'][-1])\n",
    "     \n",
    "    return len(cv_result['multi_logloss-mean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 225\n",
      "best cv score: 0.5262996936717549\n"
     ]
    }
   ],
   "source": [
    "n_estimators_gbdt_1 = get_n_estimators(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （2）调参max_depth & num_leaves\n",
    "\n",
    "    num_leaves一般建议为70-80，其值越大模型越复杂，越容易过拟合。\n",
    "    \n",
    "    此时，eta=0.1、n_estimators=225。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 4 candidates, totalling 16 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=3)]: Using backend LokyBackend with 3 concurrent workers.\n",
      "[Parallel(n_jobs=3)]: Done  16 out of  16 | elapsed:  5.5min finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=4, random_state=10, shuffle=True),\n",
       "       error_score='raise-deprecating',\n",
       "       estimator=LGBMClassifier(bagging_freq=1, boosting_type='gbdt', class_weight=None,\n",
       "        colsample_bytree=0.7, importance_type='split', learning_rate=0.1,\n",
       "        max_bin=127, max_depth=7, min_child_samples=20,\n",
       "        min_child_weight=0.001, min_split_gain=0.0, n_estimators=225,\n",
       "        n_jobs=4, num_class=9, num_leaves=31, objective='multiclass',\n",
       "        random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "        subsample=0.7, subsample_for_bin=200000, subsample_freq=0),\n",
       "       fit_params=None, iid='warn', n_jobs=3,\n",
       "       param_grid={'num_leaves': range(50, 90, 10)},\n",
       "       pre_dispatch='2*n_jobs', refit=False, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=5)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 1、交叉验证4折\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "kfold = StratifiedKFold(n_splits=4, shuffle=True, random_state=10)\n",
    "\n",
    "\n",
    "# 2、参数设置范围\n",
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators': n_estimators_gbdt_1,\n",
    "          'max_depth': 7,\n",
    "          'max_bin': 127, \n",
    "          'subsample': 0.7,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "num_leaves_s = range(50,90,10)  # 50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "\n",
    "# 3、交叉验证找最优参数\n",
    "from lightgbm.sklearn import LGBMClassifier\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=3, param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.538464894367255\n",
      "{'num_leaves': 50}\n"
     ]
    }
   ],
   "source": [
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**画图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "n_leafs = len(num_leaves_s)\n",
    "\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, -test_means)\n",
    "# plt.errorbar(x_axis, -test_means, yerr=test_stds,label = ' Test')\n",
    "# plt.errorbar(x_axis, -train_means, yerr=train_stds,label = ' Train')\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'Log Loss' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-0.53846489, -0.5387142 , -0.53956992, -0.54046966])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_means"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （3）调参min_child_samples\n",
    "\n",
    "    1. 推导过程，由于叶子节点数目为70，一共9分类，平均每类8个叶子节点。\n",
    "    2. 每棵树 稀有事件 的样本数目为：200 * 3/4(cv) * 0.7(bootstrap-subsample) = 100。\n",
    "    3. 所以每个叶子节点的样本为：100/8 = 12，故其搜索范围10-30。\n",
    "\n",
    "    此时，eta=0.1、n_estimators=225、max_depth=7、num_leaves=50。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 5 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:  4.2min\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:  6.7min remaining:   44.5s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5381662459661167\n",
      "{'min_child_samples': 30}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:  6.7min finished\n"
     ]
    }
   ],
   "source": [
    "# 1、设置参数范围\n",
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_gbdt_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':50,\n",
    "          'max_bin': 127, #2^6,原始特征为整数，很少超过100\n",
    "          'subsample': 0.7,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "min_child_samples_s = range(10,35,5) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "\n",
    "# 3、打印结果\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**画图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "#plt.errorbar(x_axis, -test_scores, yerr=test_stds ,label = ' Test')\n",
    "#plt.errorbar(x_axis, -train_scores, yerr=train_stds,label =  +' Train')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （4）调参sub_samples\n",
    "\n",
    "    此时，eta=0.1、n_estimators=225、max_depth=7、num_leaves=50、min_child_samples=30。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 5 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:  3.7min\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:  6.3min remaining:   41.8s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5365632549205728\n",
      "{'subsample': 0.8}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:  6.3min finished\n"
     ]
    }
   ],
   "source": [
    "# 1、设置参数范围\n",
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_gbdt_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':50,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127,\n",
    "#           'subsample': 0.7,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "subsample_s = [i/10.0 for i in range(5,10)]\n",
    "tuned_parameters = dict( subsample = subsample_s)\n",
    "\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "\n",
    "# 3、打印结果\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**画图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = subsample_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （5）调参colsample_bytree\n",
    "\n",
    "    此时，eta=0.1、n_estimators=225、max_depth=7、num_leaves=50、min_child_samples=30、sub_samples=0.8。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 7 candidates, totalling 28 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:  3.5min\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5350667007920246\n",
      "{'colsample_bytree': 0.5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  28 out of  28 | elapsed:  8.5min finished\n"
     ]
    }
   ],
   "source": [
    "# 1、设置参数范围\n",
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators':n_estimators_gbdt_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':50,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127,\n",
    "          'subsample': 0.8,\n",
    "          'bagging_freq': 1,\n",
    "#           'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(3,10)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "grid_search = GridSearchCV(lg, n_jobs=4,  param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "\n",
    "# 3、打印结果\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**画图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot CV误差曲线\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （6）再次调参n_estimators\n",
    "\n",
    "    此时，eta=0.1、n_estimators=225、max_depth=7、num_leaves=50、min_child_samples=30、sub_samples=0.8、colsample_bytree=0.5。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 2328\n",
      "best cv score: 0.5154806551596367\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "#           'n_estimators':n_estimators_gbdt_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':50,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127,\n",
    "          'subsample': 0.8,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.4,\n",
    "         }\n",
    "\n",
    "n_estimators_gbdt_2 = get_n_estimators(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2、LightGBM（GOSS）\n",
    "\n",
    "### （1）调参n_estimators\n",
    "\n",
    "    先预设eta=0.1，粗调基学习器的数目n_estimators。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "#           'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 6,\n",
    "          'max_bin': 127, \n",
    "#           'subsample': 0.7,\n",
    "#           'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "\n",
    "def get_n_estimators_goss (params , X_train , y_train , early_stopping_rounds=10):\n",
    "    lgbm_params = params.copy()\n",
    "    lgbm_params['num_class'] = 9\n",
    "     \n",
    "    lgbmtrain = lgbm.Dataset(X_train , y_train )\n",
    "    cv_result = lgbm.cv(lgbm_params , lgbmtrain , num_boost_round=MAX_ROUNDS , nfold=5,  metrics='multi_logloss' , early_stopping_rounds=early_stopping_rounds, seed=3 )\n",
    "     \n",
    "    print('best n_estimators:' , len(cv_result['multi_logloss-mean']))\n",
    "    print('best cv score:' , cv_result['multi_logloss-mean'][-1])\n",
    "     \n",
    "    return len(cv_result['multi_logloss-mean'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 190\n",
      "best cv score: 0.5475254449699765\n"
     ]
    }
   ],
   "source": [
    "n_estimators_goss_1 = get_n_estimators_goss(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （2）调参max_depth & num_leaves\n",
    "    \n",
    "    此时，eta=0.1、n_estimators=190。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 4 candidates, totalling 16 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  13 out of  16 | elapsed:  3.9min remaining:   54.1s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5494113858978736\n",
      "{'num_leaves': 80}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  16 out of  16 | elapsed:  4.0min finished\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1、参数设置范围\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators': n_estimators_goss_1,\n",
    "          'max_depth': 7,\n",
    "          'max_bin': 127, \n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "num_leaves_s = range(50,90,10)  # 50,60,70,80\n",
    "tuned_parameters = dict( num_leaves = num_leaves_s)\n",
    "\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)\n",
    "\n",
    "\n",
    "\n",
    "# 3、CV误差曲线画图\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "n_leafs = len(num_leaves_s)\n",
    "\n",
    "x_axis = num_leaves_s\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.xlabel( 'num_leaves' )\n",
    "plt.ylabel( 'Log Loss' )\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （3）调参min_child_samples\n",
    "\n",
    "    此时，eta=0.1、n_estimators=190、max_depth=7、num_leaves=80。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 5 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:  3.3min\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:  5.0min remaining:   33.5s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5479790086077883\n",
      "{'min_child_samples': 30}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:  5.1min finished\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1、参数设置范围\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators': n_estimators_goss_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':80,\n",
    "          'max_bin': 127, \n",
    "          'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "min_child_samples_s = range(10,35,5) \n",
    "tuned_parameters = dict( min_child_samples = min_child_samples_s)\n",
    "\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)\n",
    "\n",
    "\n",
    "\n",
    "# 3、CV误差曲线画图\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = min_child_samples_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （4）调参colsample_bytree\n",
    "\n",
    "    此时，eta=0.1、n_estimators=190、max_depth=7、num_leaves=80、min_child_samples=30。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 4 folds for each of 5 candidates, totalling 20 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Using backend LokyBackend with 4 concurrent workers.\n",
      "[Parallel(n_jobs=4)]: Done  10 tasks      | elapsed:  2.5min\n",
      "[Parallel(n_jobs=4)]: Done  18 out of  20 | elapsed:  4.3min remaining:   28.9s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5463599686405776\n",
      "{'colsample_bytree': 0.6}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=4)]: Done  20 out of  20 | elapsed:  4.4min finished\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/apple/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:125: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1、参数设置范围\n",
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.1,\n",
    "          'n_estimators': n_estimators_goss_1,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':80,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127, \n",
    "#           'colsample_bytree': 0.7,\n",
    "         }\n",
    "\n",
    "colsample_bytree_s = [i/10.0 for i in range(5,10)]\n",
    "tuned_parameters = dict( colsample_bytree = colsample_bytree_s)\n",
    "\n",
    "\n",
    "\n",
    "# 2、交叉验证找最优参数\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "\n",
    "grid_search = GridSearchCV(lg, n_jobs=4, param_grid=tuned_parameters, cv = kfold, scoring=\"neg_log_loss\", verbose=5, refit = False)\n",
    "grid_search.fit(X_train , y_train)\n",
    "\n",
    "print(-grid_search.best_score_)\n",
    "print(grid_search.best_params_)\n",
    "\n",
    "\n",
    "\n",
    "# 3、CV误差曲线画图\n",
    "test_means = grid_search.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_search.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_search.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_search.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "x_axis = colsample_bytree_s\n",
    "\n",
    "plt.plot(x_axis, -test_means)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### （5）再次调参n_estimators\n",
    "\n",
    "    此时，eta=0.1、n_estimators=190、max_depth=7、num_leaves=80、min_child_samples=30、colsample_bytree=0.6。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best n_estimators: 1784\n",
      "best cv score: 0.5320705562024879\n"
     ]
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "#           'n_estimators': n_estimators_goss_1,\n",
    "          'num_leaves': 60,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':80,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127, \n",
    "#           'subsample': 0.7,\n",
    "#           'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.6,\n",
    "         }\n",
    "\n",
    "n_estimators_goss_2 = get_n_estimators_goss(params , X_train , y_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3、训练模型（refit）\n",
    "\n",
    "    由于之前优化调参的模型，其训练样本只有15000左右，所以找到最佳参数后，再拿全体样本重训练模型时，我应该再人为修改一下参数。（嘤，如果有好的设备就不用这样了，直接暴力找超参数。\n",
    "\n",
    "   - GBDT\n",
    "           eta=0.01、n_estimators=2328、max_depth=7、num_leaves=75、min_child_samples=30、sub_samples=0.8、colsample_bytree=0.5\n",
    "           \n",
    "   - GOSS\n",
    "           eta=0.01、n_estimators=1784、max_depth=7、num_leaves=80、min_child_samples=40、colsample_bytree=0.6\n",
    "   \n",
    "\n",
    "### 3.1、LightGBM（GBDT）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(bagging_freq=1, boosting_type='gbdt', class_weight=None,\n",
       "        colsample_bytree=0.5, importance_type='split', learning_rate=0.01,\n",
       "        max_bin=127, max_depth=7, min_child_samples=30,\n",
       "        min_child_weight=0.001, min_split_gain=0.0, n_estimators=2328,\n",
       "        n_jobs=4, num_class=9, num_leaves=75, objective='multiclass',\n",
       "        random_state=None, reg_alpha=0.0, reg_lambda=0.0, silent=False,\n",
       "        subsample=0.8, subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'gbdt',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          'n_estimators':n_estimators_gbdt_2,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':75,\n",
    "          'min_child_samples':30,\n",
    "          'max_bin': 127,\n",
    "          'subsample': 0.8,\n",
    "          'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.5,\n",
    "         }\n",
    "\n",
    "lg = LGBMClassifier(silent=False,  **params)\n",
    "lg.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**特征重要性图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"importance\":list(lg.feature_importances_.T)})\n",
    "df = df.sort_values(by=['importance'],ascending=False)\n",
    "\n",
    "plt.bar(range(len(lg.feature_importances_)), lg.feature_importances_)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.1、LightGBM（GOSS）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMClassifier(boosting_type='goss', class_weight=None, colsample_bytree=0.6,\n",
       "        importance_type='split', learning_rate=0.01, max_bin=127,\n",
       "        max_depth=7, min_child_samples=40, min_child_weight=0.001,\n",
       "        min_split_gain=0.0, n_estimators=1784, n_jobs=4, num_class=9,\n",
       "        num_leaves=80, objective='multiclass', random_state=None,\n",
       "        reg_alpha=0.0, reg_lambda=0.0, silent=False, subsample=1.0,\n",
       "        subsample_for_bin=200000, subsample_freq=0)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "params = {'boosting_type': 'goss',\n",
    "          'objective': 'multiclass',\n",
    "          'num_class':9, \n",
    "          'n_jobs': 4,\n",
    "          'learning_rate': 0.01,\n",
    "          'n_estimators': n_estimators_goss_2,\n",
    "          'max_depth': 7,\n",
    "          'num_leaves':80,\n",
    "          'min_child_samples':40,\n",
    "          'max_bin': 127, \n",
    "#           'subsample': 0.7,\n",
    "#           'bagging_freq': 1,\n",
    "          'colsample_bytree': 0.6,\n",
    "         }\n",
    "\n",
    "lg_goss = LGBMClassifier(silent=False,  **params)\n",
    "lg_goss.fit(X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**特征重要性图**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame({\"columns\":list(feat_names), \"importance\":list(lg_goss.feature_importances_.T)})\n",
    "df = df.sort_values(by=['importance'],ascending=False)\n",
    "\n",
    "plt.bar(range(len(lg_goss.feature_importances_)), lg_goss.feature_importances_)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4、保存模型\n",
    "\n",
    "### 4.1、LightGBM（GBDT）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump(lg, open(\"Otto_LightGBM_tfidf.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2、LightGBM（GOSS）\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "\n",
    "pickle.dump(lg_goss, open(\"Otto_LightGBM_goss_tfidf.pkl\", 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5、模型预测 & 结果\n",
    "\n",
    "### 5.1、加载数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>feat_1_tfidf</th>\n",
       "      <th>feat_2_tfidf</th>\n",
       "      <th>feat_3_tfidf</th>\n",
       "      <th>feat_4_tfidf</th>\n",
       "      <th>feat_5_tfidf</th>\n",
       "      <th>feat_6_tfidf</th>\n",
       "      <th>feat_7_tfidf</th>\n",
       "      <th>feat_8_tfidf</th>\n",
       "      <th>feat_9_tfidf</th>\n",
       "      <th>...</th>\n",
       "      <th>feat_84_tfidf</th>\n",
       "      <th>feat_85_tfidf</th>\n",
       "      <th>feat_86_tfidf</th>\n",
       "      <th>feat_87_tfidf</th>\n",
       "      <th>feat_88_tfidf</th>\n",
       "      <th>feat_89_tfidf</th>\n",
       "      <th>feat_90_tfidf</th>\n",
       "      <th>feat_91_tfidf</th>\n",
       "      <th>feat_92_tfidf</th>\n",
       "      <th>feat_93_tfidf</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.421803</td>\n",
       "      <td>0.052224</td>\n",
       "      <td>0.842245</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>0.068759</td>\n",
       "      <td>0.094897</td>\n",
       "      <td>0.502059</td>\n",
       "      <td>0.535424</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.143963</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.070171</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.071486</td>\n",
       "      <td>0.648348</td>\n",
       "      <td>0.050417</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078248</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.071995</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.048481</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.139311</td>\n",
       "      <td>0.034257</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0.048446</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.047156</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.065018</td>\n",
       "      <td>0.081172</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.556178</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 94 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id  feat_1_tfidf  feat_2_tfidf  feat_3_tfidf  feat_4_tfidf  feat_5_tfidf  \\\n",
       "0   1      0.000000      0.000000      0.000000      0.000000           0.0   \n",
       "1   2      0.068759      0.094897      0.502059      0.535424           0.0   \n",
       "2   3      0.000000      0.071486      0.648348      0.050417           0.0   \n",
       "3   4      0.000000      0.000000      0.000000      0.048481           0.0   \n",
       "4   5      0.048446      0.000000      0.000000      0.047156           0.0   \n",
       "\n",
       "   feat_6_tfidf  feat_7_tfidf  feat_8_tfidf  feat_9_tfidf  ...  feat_84_tfidf  \\\n",
       "0           0.0      0.000000      0.000000           0.0  ...            0.0   \n",
       "1           0.0      0.000000      0.000000           0.0  ...            0.0   \n",
       "2           0.0      0.000000      0.000000           0.0  ...            0.0   \n",
       "3           0.0      0.000000      0.000000           0.0  ...            0.0   \n",
       "4           0.0      0.065018      0.081172           0.0  ...            0.0   \n",
       "\n",
       "   feat_85_tfidf  feat_86_tfidf  feat_87_tfidf  feat_88_tfidf  feat_89_tfidf  \\\n",
       "0       0.000000       0.421803       0.052224       0.842245       0.000000   \n",
       "1       0.000000       0.000000       0.000000       0.000000       0.143963   \n",
       "2       0.000000       0.000000       0.000000       0.078248       0.000000   \n",
       "3       0.139311       0.034257       0.000000       0.000000       0.000000   \n",
       "4       0.000000       0.000000       0.000000       0.000000       0.000000   \n",
       "\n",
       "   feat_90_tfidf  feat_91_tfidf  feat_92_tfidf  feat_93_tfidf  \n",
       "0            0.0       0.000000       0.000000       0.000000  \n",
       "1            0.0       0.000000       0.070171       0.000000  \n",
       "2            0.0       0.000000       0.000000       0.071995  \n",
       "3            0.0       0.000000       0.000000       0.000000  \n",
       "4            0.0       0.556178       0.000000       0.000000  \n",
       "\n",
       "[5 rows x 94 columns]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dpath = './Otto/data/'\n",
    "test = pd.read_csv(dpath +\"Otto_FE_test_tfidf.csv\")\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_id = test['id']   \n",
    "X_test = test.drop([\"id\"], axis=1)\n",
    "\n",
    "feat_names = X_test.columns \n",
    "\n",
    "from scipy.sparse import csr_matrix\n",
    "X_test = csr_matrix(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.2、提交结果\n",
    "\n",
    "#### （1）LightGBM - GBDT\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输出每类的概率\n",
    "y_test_pred = lg.predict_proba(X_test)\n",
    "\n",
    "# 生成提交结果\n",
    "out_df = pd.DataFrame(y_test_pred)\n",
    "\n",
    "columns = np.empty(9, dtype=object)\n",
    "for i in range(9):\n",
    "    columns[i] = 'Class_' + str(i+1)\n",
    "\n",
    "out_df.columns = columns\n",
    "out_df = pd.concat([test_id, out_df], axis = 1)\n",
    "out_df.to_csv(\"Otto_LightGBM_tfidf.csv\", index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### （2）LightGBM - GOSS"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 输出每类的概率\n",
    "y_test_goss_pred = lg_goss.predict_proba(X_test)\n",
    "\n",
    "# 生成提交结果\n",
    "out_df_goss = pd.DataFrame(y_test_goss_pred)\n",
    "\n",
    "columns = np.empty(9, dtype=object)\n",
    "for i in range(9):\n",
    "    columns[i] = 'Class_' + str(i+1)\n",
    "\n",
    "out_df_goss.columns = columns\n",
    "\n",
    "out_df_goss = pd.concat([test_id,out_df_goss], axis = 1)\n",
    "out_df_goss.to_csv(\"Otto_LightGBM_goss_tfidf.csv\", index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**结果：**\n",
    "\n",
    "- LightGBM（GBDT）：  \n",
    "        Private Score：0.46895    1007 / 3515\n",
    "        Public Score： 0.46882    1016 / 3515\n",
    "\n",
    "- LightGBM（GOSS）：  \n",
    "        Private Score：0.48222    1183 / 3515\n",
    "        Public Score： 0.48186     1203 / 3515  （哎呀！下次绝对拿6万来训练）  \n",
    "    \n",
    "\n",
    "*（我先为自己开脱几句，这个结果肯定是没有预料中的好，毕竟数据没有跑全。但不是我不想跑全，是我的电脑说它做不到，我莫得办法。好吧👌，也有可能是我懒得等，哎！这个一次真的要运行好久好久的）*\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
